// console.log(process)

let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('p1 data')
  }, 1000);
  // setTimeout(() => {
  //   reject('p1 err')
  // }, 1000);
})


let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('p2 data')
  }, 2000);
  // setTimeout(() => {
  //   reject('p2 err')
  // }, 2000);
})

let p3 = new Promise((resolve, reject) => {
  // setTimeout(() => {
  //   resolve('p3 data')
  // }, 3000);
  setTimeout(() => {
    reject('p3 err')
  }, 3000);
})


// all  如果有一个reject，就会被catch，返回reject的内容，否则就全部resolve，返回resolve的数组
// then会接收resolve返回的值，同样的，await也可以接收
Promise.all([p1, p2, p3]).then(res => {
  console.log(`all: ${res}`)
}).catch((e) => {
  console.log(`all: ${e}`)
})


// race 字面意思，赛跑，只要有一个promise先回馈状态了，race就跟着回馈状态，比如最先给了reject，那么race的状态就是reject
Promise.race([p1, p2, p3]).then(res => {
  console.log(`race: ${res}`)
}).catch(e => {
  console.log(`race: ${e}`)
})

// 场景：
// 当一个接口有三个请求接口地址，请求的数据是一致的时候，为了保证接口的最快速度匹配，可以使用这个方法

//  在Promise实例中，放入一个延时器函数， setTimeout(() => reject(new Error('request timeout')), time) ，
// 可以通过它来设置这个接口的，相当于 p3() 必须在规定秒内完成，否则会直接失败

const dataList = Promise.race([
  p3,
  new Promise(function (resolve, reject) {
    // 可以通过new Error创建一个错误
    setTimeout(() => reject(new Error('request timeout')), 2900)
  })
]).then(res => {})
.catch(e => console.log(e))


// allSettled   不是稳定接收，所有的状态，不管是reject还是resolve都会接收，始终只会走 .then() ，没有 .catch()
// 场景：并不关心接口的结果，只关心这些操作有没有结束。
Promise.allSettled([p1, p2, p3]).then((res) => {
  console.log(`allSettled: ${res}`)
})

// 和all对应，只要有一个resolve就会resolve走then继续
// 和race不同的是，只会等resolve，如果都是reject，any才会reject
// 场景：只要一个成功就行，除非全部不成功，才会失败
Promise.any([p1, p2, p3]).then(res => {
  console.log(`any: ${res}`)
}).catch(e => {
  console.log(`any: ${e}`)
})